
/**
 * Marca como seleccionado el menu correspondiente a la seccion actual
 */
$(document).ready(function() {

	var pathname = window.location.pathname;
	var paths = pathname.split("/");
	var path = "";
	if (paths.length > 1) {
		path = paths[paths.length-1];
	}

	var shortPath = path.substring(0, path.indexOf("_"));

	$("li").removeClass("active");
	$("#" + shortPath).addClass("active");
});


/**
 * Hace un uncheck de todos los checkboxs a exception del checkbox con id que se pasa
 * como parametro.
 * @param	id		el id del check que se omite
 */
$.fn.uncheckOthers = function(id) {
	
	var checkboxes = $(":checked");
	for (var i=0; i<checkboxes.length; i++) {
		var chk = checkboxes[i];
		if (chk.id != id){ 
			chk.checked = false;
		}
	}
};


/**
 * Obtiene una entidad y completa un formularios con los valores. 
 * Los ids de los campos del formulario deben llamarse igual que los atributos del DTO
 * @param to			el servlet
 * @param idEntity		el id de la entidad a obtener
 * @param callback		funcion a ejecutar cuando termine la ejecucion del metodo
 */
$.fn.getById = function(to, idEntity, callback) {
	
	$.fn.send(to, null, null, "id="+idEntity, function (res) {
		
		var response = eval(res);
		var entity = eval('('+response.lista+')');
		
//		$.fn.fillValue(null, entity, null);
		
		$.each(entity, function(id, el) {

			if (el instanceof Object) {							// reemplazar por funcion recursiva
				$.each(el, function(i, e) {
					
					if ( e instanceof Object && i == "items") {
						$.fn.loadItemsFactura(e);
					} else if (e instanceof Object) {
						
						$.each(e, function(ii, ei) {
							$('#' + i + ' #'+ ii).val(ei);
						});
						
					} else {
						$('#' + id + ' #'+ i).val(e);
					}
				});
			} else {
				$('.form-horizontal ' + '#'+id).val(el);
			}
		});
		
		if (callback != null) {
			var args = [];
			args[0] = entity;
			callback.apply(null, args);
		}
	});
};

/**
 * Funcion recursiva que carga los valores del formulario
 */
//$.fn.fillValue = function(id, entity, prev) {
//	
//	if (entity instanceof Object) {
//		
//		if (id == 'items') {	// hardcoded, caso especial de items de factura
//			$.fn.loadItemsFactura(entity);
//		} else {
//		
//			$.each(entity, function(i, el) {
//			
//				$.fn.fillValue(i, el, prev);
//			});
//		}
//	} else {
//		
//		if (prev == null) {
//			$('.form-horizontal ' + '#'+id).first().val(entity);
//		} else {
//			$('#' + prev + ' #'+ id).val(entity);
//		}
//	}
//};

$.fn.loadItemsFactura = function(entities) {
	
	for (var i=0; i<entities.length; i++) {
		agregarItem(i);
		var entity = entities[i];
		$.each(entity, function(id, el) {
			 $('.itemfactura-' + i + ' #' + id).val(el);
		});
	}

};


/**
 * Obtiene una lista y la muestra
 * @param to		  el servlet
 * @param idList	  la lista donde se mostrara la info
 * @param idForm 	  formulario con datos a enviar al servlet
 * @param cols		  array ordenado con las columnas a mostrar en la tabla. El nombre de las columnas debe mapear con los atributos del DTO.
 * @param extraParams parametros extras a enviar (por ej. dato1=valor1&dato2=valor2....
 * @param callback	  funcion de callback
 * @param showIdValue boolean para determinar si se muestra el valor del ID o no
 */
$.fn.getList = function(to, idList, idForm, cols, extraParams, callback, showIdValue) {
	
	$.fn.send(to, idForm, null, extraParams, function (res) {
		
		var tabla = $('#'+idList);
		
		var html = "";
		
		// filas
		var lineas = eval(res.lista);
		$.each(lineas,function(i, linea) {
			html += "<tr>";

			// columnas
			for (var i=0; i<cols.length; i++) {
				var colName = cols[i];

				if (colName.indexOf(".") > 0) {	 // parent.child  Por Ej. facturaDTO.monto
					var inf = colName.split(".");
					var parent = inf[0];
					var child = inf[1];
					if (linea[parent] !== undefined) {			// Hay casos donde un objeto anidado puede venir vacio
						html += "<td>" + linea[parent][child] + "</td>";
					} else {
						html += "<td>-</td>"; 
					}
				} else if (colName == "id") {
					html += "<td style=\"font-size:10px\"><input id=\"" + linea[colName] + "\" type=\"checkbox\" value=\"" + linea[colName] + "\" onclick=\"$.fn.uncheckOthers(this.id)\" />"; 
					if (showIdValue) {
						html +=	linea[colName];
					}
					html += "</td>";
				
				} else if (colName.indexOf("id") == 0) {
				
					html += "<input id=\"" + linea[colName] + "\" type=\"hidden\" value=\"" + linea[colName] + " \"/>";
				} else {
					if (linea[colName] === undefined) {
						html += "<td>-</td>";
					} else {
						html += "<td>" + linea[colName] + "</td>";
					}
				}
			}
			html += "</tr>";
		});
		
		tabla.html(html);
	});
};


/**
 * Hace una llamada Ajax al servidor
 * @param to			el servlet
 * @param formId		el form con la info a enviar
 * @param buttonId		el boton que envia la info
 * @param extraParams	parametros extras a enviar por ej. datoaux=carlitos&dni=100000 ...
 * @param callback		funcion de callback
 * @param hideModal		esconde la ventana modal (uso exclusivo para agregar/edicion) cuando termina de ejecutarse la llamada ajax
 * @param modalToHide	id del modal a esconder. Si esta especificado el hideModal en true, se escondera la ventana modal indicada, si no se especifica
 * 						ninguno, se esconderan todas las ventanas modales.
 */
$.fn.send = function(to, formId, buttonId, extraParams, callback, hideModal, modalToHide) {
	
	var form = $('#'+formId);
	var button = $('#'+buttonId);
	button.attr('data-loading-text', '');
	
	var queryString = form.serialize();

	$.ajax({
   		type: "POST",
   		url:  to,
   		data: queryString + "&" + (extraParams || ""),
   		success: function(res) {

   			var response = eval(res);
   			
   			$.fn.setMessage(response.ok, response.mensaje);
   			

			if ( (hideModal === true || hideModal == null) && response.ok) {
				if (modalToHide) {
					$('#'+modalToHide).modal('hide');
				} else {
					$('.agregarModalForm').modal('hide');
				}
			}
   			
   			if (callback != null) {
   				callback(response);
   			}
   		},
   		error: function() {
			$.fn.setMessage("false", "Hubo un error al realizar la operación");
   		}
	});
};

/**
 * Obtiene todos los productos
 * @param idCombo	id del combo donde se mostrarán los productos
 */
$.fn.fillProductos = function(idCombo) {
	
	var combo = $('#'+idCombo);
	combo.attr('disabled', true);
	
	$.ajax({
   		type: "GET",
   		url:  'productos_getAllProductos',
   		success: function(res) {

   			var response = eval(res);
   			var productos = JSON.parse(response.lista);
   			for (var i=0; i<productos.length; i++) {
   				var producto = productos[i];
   				combo.append('<option value="' + producto.id + '">' + producto.descripcion + '</option>');
   			}
   			combo.attr('disabled', false);
   		}
	});
};

/**
 * Obtiene 'localidades de Buenos Aires'
 * @param idCombo	id del combo donde se mostrarán las localidades
 */
$.fn.getLocalidadesBsAs = function(idCombo) {
	
	var combo = $('#'+idCombo);
	combo.attr('disabled', true);
	
	$.ajax({
   		type: "GET",
   		url:  'commons_getLocalidades',
   		success: function(res) {

   			var response = eval(res);
   			var localidades = JSON.parse(response.lista);
   			for (var i=0; i<localidades.length; i++) {
   				var localidad = localidades[i];
   				combo.append('<option value="' + localidad.nombre + '">' + localidad.nombre + '</option>');
   			}
   			combo.attr('disabled', false);
   		}
	});
};

/**
 * Gets provincias
 * @param idCombo	id of combo element to fill with provincias
 */
$.fn.getProvincias = function(idCombo) {
	
	var combo = $('#'+idCombo);
	combo.attr('disabled', true);
	
	$.ajax({
   		type: "GET",
   		url:  'commons_getProvincias',
   		success: function(res) {

   			var response = eval(res);
   			var provincias = JSON.parse(response.lista);
   			for (var i=0; i<provincias.length; i++) {
   				var provincia = provincias[i];
   				combo.append('<option value="' + provincia.nombre + '">' + provincia.nombre + '</option>');
   			}
   			combo.attr('disabled', false);
   		}
	});
};


/**
 * Autohide mensaje
 */
$.fn.setMessageAutohide = function() {
	window.setTimeout(function() { $(".mensajes").alert('close'); }, 4000);
};

/**
 * Mostrar mensaje
 */
$.fn.setMessage = function(estado, mensaje) {
		
		if (estado == null) {
			return;
//			$(".mensajes").alert('close'); 
		}
		
		$('.mensajes-container').html("<center><div class='alert mensajes' data-dismiss='alert'></center>");
		
		$.fn.setMessageAutohide();
	
		var style = "alert-error";
		if (estado == "true") {
   			style = 'alert-success';
		}
		var elem = $('.mensajes');
		elem.addClass(style);
		elem.html(mensaje);
		elem.alert();
};

/**
 * Muestra/oculta un elemento
 */
function toggle(id) {
	$('#'+id).toggle();
}